home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / MDIOLE.PAK / MDIOLE.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  8KB  |  280 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1994 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include <owl/pch.h>
  5. #include <owl/applicat.h>
  6. #include <owl/editfile.h>
  7. #include <owl/mdi.h>
  8. #include <owl/decmdifr.h>
  9. #include <owl/statusba.h>
  10. #include <owl/controlb.h>
  11. #include <owl/buttonga.h>
  12. #include <owl/gdiobjec.h>
  13. #include <owl/olemdifr.h>
  14. #include <owl/uihelper.h>
  15. #include <ocf/ocdoc.h>
  16. #include <ocf/ocview.h>
  17.  
  18. #include "sampcont.h"
  19. #include "mdiole.h"
  20.  
  21. // Locations for toolbar placement
  22. //
  23. const TDecoratedFrame::TLocation Location[] = {
  24.   TDecoratedFrame::Top,
  25.   TDecoratedFrame::Left,
  26.   TDecoratedFrame::Right
  27. };
  28.  
  29. // App registration object
  30. //
  31. static TPointer<TOcRegistrar> Registrar;
  32.  
  33. // Registration tables
  34. //
  35. REGISTRATION_FORMAT_BUFFER(100)
  36.  
  37. BEGIN_REGISTRATION(AppReg)
  38.  REGDATA(clsid,      "{5E4BD400-8ABC-101B-A23B-CE4E85D07ED2}")
  39.  REGDATA(appname,    "MdiOle")
  40. END_REGISTRATION
  41.  
  42. //----------------------------------------------------------------------------
  43. // Ole MDI application class
  44. //
  45.  
  46. class TOwlMdiApp : public TApplication, public TOcModule {
  47.   public:
  48.     TOwlMdiApp();
  49.    ~TOwlMdiApp();
  50.     void InitMainWindow();
  51.     void InitInstance();
  52.  
  53.   protected:
  54.     TOpenSaveDialog::TData   FileData;
  55.     TMDIClient*              Client;
  56.     TGadgetWindow::THintMode HintMode;
  57.     TOleMDIFrame*            Frame;
  58.     TControlBar*             ControlBar;
  59.     int                      ControlBarLoc;
  60.  
  61.   protected:
  62.     void CmFileNew();
  63.     void CmFileOpen();
  64.     void CmToggleHint();
  65.     void CeToggleHint(TCommandEnabler&);
  66.     void CmToggleBar();
  67.     void CmToggleStatus();
  68.     void CeToggleStatus(TCommandEnabler&);
  69.  
  70.   DECLARE_RESPONSE_TABLE(TOwlMdiApp);
  71. };
  72.  
  73. DEFINE_RESPONSE_TABLE1(TOwlMdiApp, TApplication)
  74.   EV_COMMAND(CM_FILENEW, CmFileNew),
  75.   EV_COMMAND(CM_FILEOPEN, CmFileOpen),
  76.   EV_COMMAND(CM_TOGGLEHINT, CmToggleHint),
  77.   EV_COMMAND_ENABLE(CM_TOGGLEHINT, CeToggleHint),
  78.   EV_COMMAND(CM_TOGGLEBAR, CmToggleBar),
  79.   EV_COMMAND(CM_TOGGLESTATUS, CmToggleStatus),
  80.   EV_COMMAND_ENABLE(CM_TOGGLESTATUS, CeToggleStatus),
  81. END_RESPONSE_TABLE;
  82.  
  83.  
  84. TOwlMdiApp::TOwlMdiApp()
  85.  : TApplication(::AppReg["appname"])
  86. {
  87.   // Make OC app helper
  88.   //
  89.   OcInit(*::Registrar, ::Registrar->GetOptions());
  90. }
  91.  
  92. TOwlMdiApp::~TOwlMdiApp()
  93. {
  94. }
  95.  
  96. static TControlBar*
  97. BuildControlBar(TWindow* parent, TControlBar::TTileDirection direction)
  98. {
  99.   TControlBar* cb = new TControlBar(parent, direction);
  100.   cb->Insert(*new TButtonGadget(CM_FILENEW, CM_FILENEW));
  101.   cb->Insert(*new TButtonGadget(CM_FILEOPEN, CM_FILEOPEN));
  102.   cb->Insert(*new TButtonGadget(CM_FILESAVE, CM_FILESAVE));
  103.   cb->Insert(*new TButtonGadget(CM_FILESAVEAS, CM_FILESAVEAS));
  104.  
  105.   cb->Insert(*new TSeparatorGadget(6));
  106.   cb->Insert(*new TButtonGadget(CM_EDITUNDO, CM_EDITUNDO));
  107.   cb->Insert(*new TButtonGadget(CM_EDITCUT, CM_EDITCUT));
  108.   cb->Insert(*new TButtonGadget(CM_EDITCOPY, CM_EDITCOPY));
  109.   cb->Insert(*new TButtonGadget(CM_EDITPASTE, CM_EDITPASTE));
  110.  
  111.   cb->Insert(*new TSeparatorGadget(6));
  112.   cb->Insert(*new TButtonGadget(CM_EDITFIND, CM_EDITFIND));
  113.   cb->Insert(*new TButtonGadget(CM_EDITREPLACE, CM_EDITREPLACE));
  114.   cb->Insert(*new TButtonGadget(CM_EDITFINDNEXT, CM_EDITFINDNEXT));
  115.  
  116.   cb->Insert(*new TSeparatorGadget(6));
  117.   cb->Insert(*new TButtonGadget(CM_TOGGLEHINT, CM_TOGGLEHINT,
  118.                       TButtonGadget::NonExclusive));
  119.   cb->Insert(*new TSeparatorGadget(6));
  120.   cb->Insert(*new TButtonGadget(CM_TOGGLEBAR, CM_TOGGLEBAR));
  121.  
  122.   cb->Attr.Style |= WS_CLIPSIBLINGS;    // since toolbar may move around
  123.   cb->Attr.Id = IDW_TOOLBAR;            // From oleframe.h, so we can hide it
  124.  
  125.   return cb;
  126. }
  127.  
  128. //
  129. // Construct the TOwlMdiApp's MainWindow of class TMDIFileWindow,
  130. // loading its menu, accelerator table & icon
  131. //
  132. void
  133. TOwlMdiApp::InitMainWindow()
  134. {
  135.   Client = new TMDIClient;
  136.   Frame = new TOleMDIFrame(GetName(), IDM_EDITFILE_DOC, *Client, true);
  137.   SetMainWindow(Frame);
  138.  
  139.   Frame->Attr.AccelTable = IDA_MDIFILE;
  140.   Frame->SetMenuDescr(TMenuDescr(IDM_EDITFILE_DOC));
  141.   Frame->SetIcon(this, IDI_MULTIFILE);
  142.  
  143.   // Construct, build and insert a control bar into the frame. Start out at
  144.   // the top of the frame
  145.   //
  146.   HintMode = TGadgetWindow::PressHints;
  147.   ControlBarLoc = 0;
  148.   ControlBar = BuildControlBar(Frame, TControlBar::Horizontal);
  149.   Frame->Insert(*ControlBar, Location[ControlBarLoc]);
  150.  
  151.   // Construct a status bar & insert it at the bottom
  152.   //
  153.   TStatusBar* sb = new TStatusBar(0, TGadget::Recessed,
  154.            TStatusBar::CapsLock | TStatusBar::NumLock | TStatusBar::Overtype);
  155.  
  156.   Frame->Insert(*sb, TDecoratedFrame::Bottom);
  157.  
  158.   EnableCtl3d(true);
  159.  
  160.   // Initialize the file data struct used for open and saveas
  161.   //
  162.   FileData.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
  163.   FileData.SetFilter(string(*this, IDS_DOCFILEFILTER).c_str());
  164. }
  165.  
  166. //
  167. // Call file new command handler to get the initial new window
  168. //
  169. void
  170. TOwlMdiApp::InitInstance()
  171. {
  172.   TApplication::InitInstance();
  173.   CmFileNew();
  174. }
  175.  
  176. //
  177. // Respond to "New" command by constructing, creating, and setting up a
  178. // new TFileWindow MDI child
  179. //
  180. void
  181. TOwlMdiApp::CmFileNew()
  182. {
  183.   TMDIChild* child = new TMDIChild(*Client, "", new TOleSampContainer(0, 0));
  184.   child->SetMenuDescr(TMenuDescr(IDM_EDITFILE_CHILD));
  185.   child->SetIcon(this, IDI_DOC);
  186.  
  187.   TMDIChild* curChild = Client->GetActiveMDIChild();
  188.   if (curChild && (curChild->GetWindowLong(GWL_STYLE) & WS_MAXIMIZE))
  189.     child->Attr.Style |= WS_MAXIMIZE;
  190.  
  191.   child->Create();
  192. }
  193.  
  194. //
  195. // Respond to "Open" command by constructing, creating, and setting up a
  196. // new TFileWindow in an MDI child
  197. //
  198. void
  199. TOwlMdiApp::CmFileOpen()
  200. {
  201.   *FileData.FileName = 0;
  202.   if (TFileOpenDialog(MainWindow, FileData).Execute() == IDOK) {
  203.   
  204.     TMDIChild* child;
  205.     
  206.     TRY {
  207.       child = new TMDIChild(*Client, "", new TOleSampContainer(0, FileData.FileName));
  208.     }
  209.     CATCH( (TXObjComp& x) {
  210.       GetMainWindow()->MessageBox(x.why().c_str(), GetName(), 
  211.         MB_OK|MB_ICONEXCLAMATION);
  212.       return;
  213.     })
  214.     
  215.     child->SetMenuDescr(TMenuDescr(IDM_EDITFILE_CHILD));
  216.     child->SetIcon(this, IDI_DOC);
  217.  
  218.     TMDIChild* curChild = Client->GetActiveMDIChild();
  219.     if (curChild && (curChild->GetWindowLong(GWL_STYLE) & WS_MAXIMIZE))
  220.       child->Attr.Style |= WS_MAXIMIZE;
  221.  
  222.     child->Create();
  223.   }
  224. }
  225.  
  226. void
  227. DoCreateChild(TWindow* win, void*)
  228. {
  229.   if (win->IsFlagSet(wfAutoCreate))
  230.     win->Create();
  231. }
  232.  
  233. void
  234. TOwlMdiApp::CeToggleHint(TCommandEnabler& ce)
  235. {
  236.   ce.SetCheck(HintMode == TGadgetWindow::EnterHints);
  237. }
  238.  
  239. void
  240. TOwlMdiApp::CmToggleHint()
  241. {
  242.   HintMode = HintMode==TGadgetWindow::PressHints ?
  243.                TGadgetWindow::EnterHints :
  244.                TGadgetWindow::PressHints;
  245.  
  246.   ControlBar->SetHintMode(HintMode);
  247.   ControlBar->SetHintCommand(-1);  // make sure we don't leave hint text dangling
  248. }
  249.  
  250. void
  251. TOwlMdiApp::CmToggleBar()
  252. {
  253.   ControlBarLoc = (ControlBarLoc+1) % COUNTOF(Location);
  254.   ControlBar->SetDirection(ControlBarLoc==0 ?
  255.                            TControlBar::Horizontal : TControlBar::Vertical);
  256.   Frame->Insert(*ControlBar, Location[ControlBarLoc]);
  257.   Frame->Layout();
  258. }
  259.  
  260. void
  261. TOwlMdiApp::CeToggleStatus(TCommandEnabler& ce)
  262. {
  263.   ce.SetCheck(GetMainWindow()->ChildWithId(IDW_STATUSBAR)->IsWindowVisible());
  264. }
  265.  
  266. void
  267. TOwlMdiApp::CmToggleStatus()
  268. {
  269.   GetMainWindow()->SendMessage(WM_COMMAND, IDW_STATUSBAR);  // toggle status bar on/off
  270. }
  271.  
  272. int
  273. OwlMain(int /*argc*/, char* /*argv*/ [])
  274. {
  275.   ::Registrar = new TOcRegistrar(::AppReg, 0, TApplication::GetCmdLine());
  276.   if (::Registrar->IsOptionSet(amAnyRegOption))
  277.     return 0;
  278.   return TOwlMdiApp().Run();
  279. }
  280.